package com.jun.admin.core.service.impl;

import com.jun.admin.core.service.WordService;
import com.jun.admin.core.utils.WordUtil;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author yuejun.li
 * @date 2024/10/10 18:08:40
 */
@Slf4j
@Service
@AllArgsConstructor
public class WordServiceImpl implements WordService {

    private WordUtil wordUtil;

    @SneakyThrows
    @Override
    public void wordExport2(HttpServletResponse response) {
        String fileName = "分析报告";

        //获取word模板（图表要word模板上创建，参数则在下面代码替换）
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("template/word/people2.docx");

        XWPFDocument document = null;

        try{
            // 获取docx解析对象
            document = new XWPFDocument(is);

            List<Number[]> firstBarValues = new ArrayList<>();
            // 第一个系列的值
            firstBarValues.add(new Number[]{20, 100, 30, 30, 30, 30, 30});
            // 第二个系列的值
            firstBarValues.add(new Number[]{0, -20, 50, 50, 20, 10, 10});
            // 第三个系列的值
            firstBarValues.add(new Number[]{-20, 20, -20, 10, 10, 10, 50});
            // x轴的值
            String[] xValues = new String[]{"2023/11/1", "2023/11/4", "2023/11/8", "2023/11/12", "2023/11/16", "2023/11/20", "2023/11/23"};
            //系列信息（一维是图表类型，二维是某个图表类型的标题名称）
            String[][] seriesNames = {{"诉求数量"},{"同比","环比"}};
            // 替换图表
            wordUtil.exportMultiChart(document,"人口出生报告", fileName,firstBarValues, xValues, seriesNames);
            // 输出新文件
            document.write(response.getOutputStream());
            document.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /*private static XWPFChart changeChart2(XWPFDocument document, List<Number[]> singleBarValues, String[] xValues, String[][] seriesNames) {
        //获取word中所有图表对象
        List<XWPFChart> charts = document.getCharts();
        //获取第一个单系列柱状图
        XWPFChart docChart = charts.get(0);
        //图表整体的标题 传空值则不替换标题
        String chartTitle = "人口出生报告";
        if (StringUtil.isNotBlank(chartTitle)) {
            docChart.setTitleText(chartTitle);
            docChart.setTitleOverlay(false);
        }

        //获取图表数据对象
        XDDFChartData chartData = null;

        //word图表均对应一个内置的excel，用于保存图表对应的数据
        //excel中 第一列第二行开始的数据为分类信息
        //CellRangeAddress(1, categories.size(), 0, 0) 四个参数依次为 起始行 截止行 起始列 截止列。

        //excel中分类信息的范围
        String catDataRange = docChart.formatRange(new CellRangeAddress(1, xValues.length, 0, 0));
        //根据分类信息的范围创建分类信息的数据源
        XDDFDataSource<?> catDataSource = XDDFDataSourcesFactory.fromArray(xValues, catDataRange, 0);
        //更新数据
        int indexCount = 0;
        //外循环 因有2种类型的图标（柱形+折线），所以循环次数为2
        for (int i = 0; i < seriesNames.length; i++) {
            chartData = docChart.getChartSeries().get(i);
            for (int j = 0; j < seriesNames[i].length; j++) {
                //excel中各系列对应的数据的范围
                String valDataRange = docChart.formatRange(new CellRangeAddress(1, xValues.length, indexCount + 1, indexCount + 1));
                //根据数据的范围创建值的数据源
                Number[] val = singleBarValues.get(indexCount);
                XDDFNumericalDataSource<Number> valDataSource = XDDFDataSourcesFactory.fromArray(val, valDataRange, indexCount + 1);
                //获取图表系列的数据对象(第一个chartData为柱形图，第二个chartData为折线图，然后再获取图中的系列对象)
                XDDFChartData.Series series = chartData.getSeries(j);
                //替换系列数据对象中的分类和值
                series.replaceData(catDataSource, valDataSource);
                //修改系列数据对象中的标题
                CellReference cellReference = docChart.setSheetTitle(seriesNames[i][j], indexCount + 1);
                series.setTitle(seriesNames[i][j], cellReference);
                //更新图表数据对象
                docChart.plot(chartData);
                indexCount++;
            }
        }
        return docChart;
    }*/


    //对于只有主坐标的时候
    //https://blog.csdn.net/m0_55051386/article/details/135485759
    //https://blog.csdn.net/cheng137666/article/details/110950613?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-1-110950613-blog-135485759.235%5Ev43%5Epc_blog_bottom_relevance_base3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ECtr-1-110950613-blog-135485759.235%5Ev43%5Epc_blog_bottom_relevance_base3&utm_relevant_index=1
    //https://blog.csdn.net/qq_28643437/article/details/120918093
    @Override
    public void wordExport(HttpServletResponse response) throws UnsupportedEncodingException {
        String fileName = "人口出生报告";

        //获取word模板（图表要word模板上创建，参数则在下面代码替换）
        InputStream is = this.getClass().getClassLoader().getResourceAsStream("template/word/people.docx");

        XWPFDocument document = null;

        try{
            // 获取docx解析对象
            document = new XWPFDocument(is);
            // 值
            List<Number[]> firstBarValues = new ArrayList<>();
            // 第一个系列的值
            firstBarValues.add(new Number[]{2000, 6000, 1000, 3000, 7000, 3000, 3000});
            // 第二个系列的值
            firstBarValues.add(new Number[]{100, 500, 200, 700, 300, 100, 100});
            // x轴的值（分类信息）
            String[] xValues = new String[]{"2018", "2019", "2020", "2021", "2022", "2023", "2024"};
            // 统计对象（系列信息）
            String[] seriesNames = {"人口出生数","人口死亡数"};
            // 替换图表
            wordUtil.exportSingleChart(document,"人口出生数&人口死亡数",fileName,firstBarValues, xValues, seriesNames);
            // 输出新文件
            document.write(response.getOutputStream());
            document.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    /*private static XWPFChart changeChart(XWPFDocument document, List<Number[]> singleBarValues, String[] xValues, String[] seriesNames) {
        //获取word中所有图表对象
        List<XWPFChart> charts = document.getCharts();
        //获取第一个单系列柱状图
        XWPFChart docChart = charts.get(0);
        //图表整体的标题 传空值则不替换标题
        String chartTitle = "人口出生&死亡图表";
        if (StringUtil.isNotBlank(chartTitle)) {
            docChart.setTitleText(chartTitle);
            docChart.setTitleOverlay(false);
        }

        //获取图表数据对象（xlsx的图表对象）
        //图表里的图类型数量（比如折线+柱形的组合图则 getChartSeries.size = 2）
        //还有区域图、柱状图、饼图、雷达图等...
        XDDFChartData chartData = docChart.getChartSeries().get(0);

        //word图表均对应一个内置的excel，用于保存图表对应的数据
        //excel中 第一列第二行开始的数据为分类信息
        //CellRangeAddress(1, categories.size(), 0, 0) 四个参数依次为 起始行 截止行 起始列 截止列。

        //excel中分类信息的范围
        String catDataRange = docChart.formatRange(new CellRangeAddress(1, xValues.length, 0, 0));
        //根据分类信息的范围创建分类信息的数据源（填分类信息）
        XDDFDataSource<?> catDataSource = XDDFDataSourcesFactory.fromArray(xValues, catDataRange, 0);
        //更新数据
        for (int i = 0; i < seriesNames.length; i++) {
            //excel中各系列对应的数据的范围（以列为单位划范围，第一次循环为人口出生数）
            String valDataRange = docChart.formatRange(new CellRangeAddress(1, xValues.length, i + 1, i + 1));
            //根据数据的范围创建值的数据源（填值信息）
            Number[] val = singleBarValues.get(i);
            XDDFNumericalDataSource<Number> valDataSource = XDDFDataSourcesFactory.fromArray(val, valDataRange, i + 1);
            //获取图表系列的数据对象
            XDDFChartData.Series series = chartData.getSeries(i);
            //替换系列数据对象中的分类和值
            series.replaceData(catDataSource, valDataSource);
            //修改系列数据对象中的标题（系列的标题名）
            CellReference cellReference = docChart.setSheetTitle(seriesNames[i], i + 1);
            series.setTitle(seriesNames[i], cellReference);
            //更新图表数据对象
            docChart.plot(chartData);
        }
        return docChart;
    }*/
}
